package com.sscl.baselibrary.fragment

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.annotation.IdRes
import androidx.fragment.app.Fragment
import com.sscl.baselibrary.R

/**
 * fragment的基类
 *
 * @author alm
 */
abstract class BaseFragment : Fragment() {

    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     *
     * 属性声明
     *
     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

    /* * * * * * * * * * * * * * * * * * * 常量属性 * * * * * * * * * * * * * * * * * * */

    protected val TAG: String = javaClass.simpleName

    /* * * * * * * * * * * * * * * * * * * 延时初始化属性 * * * * * * * * * * * * * * * * * * */

    /**
     * 获取此界面的根布局
     *
     * @return 此界面的根布局
     */
    /**
     * 整个Fragment的根布局
     */
    @Suppress("MemberVisibilityCanBePrivate")
    protected lateinit var rootView: View
        private set

    /* * * * * * * * * * * * * * * * * * * 私有可空属性 * * * * * * * * * * * * * * * * * * */

    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     *
     * 重写方法
     *
     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val contentView: View =
            inflater.inflate(R.layout.com_jackiepenghe_baselibrary_fragment_base, container, false)
        doBeforeSetLayout()
        val frameLayout: FrameLayout = contentView.findViewById(R.id.base_frame_content)
        rootView = inflater.inflate(setLayout(), frameLayout, false)
        frameLayout.addView(rootView)
        return contentView
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initData()
        initViews(savedInstanceState)
        initViewData()
        initEvents()
        doAfterAll()
    }

    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     *
     * 抽象方法
     *
     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

    /**
     * 在设置布局之前进行的操作
     */
    protected abstract fun doBeforeSetLayout()

    /**
     * 设置fragment的布局
     *
     * @return 布局id
     */
    protected abstract fun setLayout(): Int

    /**
     * 初始化数据
     */
    protected abstract fun initData()

    /**
     * 初始化控件
     */
    protected abstract fun initViews(savedInstanceState: Bundle?)

    /**
     * 初始化控件数据
     */
    protected abstract fun initViewData()

    /**
     * 初始化事件
     */
    protected abstract fun initEvents()

    /**
     * 在最后执行的操作
     */
    protected abstract fun doAfterAll()

    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     *
     * 自定义子类可用的方法
     *
     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

    /**
     * 让fragment可以和Activity一样拥有findViewById函数
     *
     * @param viewId 控件id
     * @return 控件
     */
    protected fun <T : View> findViewById(@IdRes viewId: Int): T {
        return rootView.findViewById<T>(viewId)
    }

    /**
     * 将整个fragment的所有布局隐藏
     */
    protected fun hideAll() {
        rootView.visibility = View.GONE
    }

    /**
     * 将整个fragment的所有布局显示
     */
    protected fun showAll() {
        rootView.visibility = View.VISIBLE
    }
}